10 ;KRAZY KATERPILLARS 20 ;DAVID HUFF 30 ; 40 ; 50 ;RUN ADDRESS: $2000 60 ; 70 ; 80 .OPT NO EJECT 90 .TAB 12,17,28 0100 ; 0110 ;SYSTEM EQUATES 0120 ; 0130 HPOSP0 = $D000 0140 HPOSM0 = $D004 0150 SIZEP0 = $D008 0160 SIZEM = $D00C 0170 M0PF = $D000 0180 P0PF = $D004 0190 M0PL = $D008 0200 PMBASE = $D407 0210 HITCLR = $D01E 0220 GRACTL = $D01D 0230 SDMCTL = $022F 0240 GPRIOR = $026F 0250 SDLSTL = $0230 0260 VDSLST = $0200 0270 CHBAS = $02F4 0280 STICK0 = $0278 0290 STRIG0 = $0284 0300 PCOLR0 = $02C0 0310 COLOR0 = $02C4 0320 ATRACT = $4D 0330 COLPF0 = $D016 0340 AUDCTL = $D208 0350 AUDF1 = $D200 0360 AUDC1 = $D201 0370 AUDF2 = $D202 0380 AUDC2 = $D203 0390 AUDF3 = $D204 0400 AUDC3 = $D205 0410 AUDF4 = $D206 0420 AUDC4 = $D207 0430 RANDOM = $D20A 0440 XITVBV = $E462 0450 SETVBV = $E45C 0460 SIOINV = $E465 0470 NMIEN = $D40E 0480 WSYNC = $D40A 0490 CONSOL = $D01F 0500 ; 0510 ;PROGRAM REGISTERS 0520 ; 0530 *= $B0 0540 ; 0550 VP0LO *= *+1 ;Y POS. PLAYER0 0560 VP0HI *= *+1 0570 SHP0 *= *+1 ;X POS. PLAYER0 0580 VP1LO *= *+1 ;Y POS. PLAYER1 0590 VP1HI *= *+1 0600 SHM0 *= *+4 ;X POS. MISSILES 0610 VPMLO *= *+4 ;Y POS. MISSILES 0620 HPOSM *= *+1 ;X POS. COLLISION 0630 VPM0LO *= *+1 ;Y POS. COLLISION 0640 VPM0HI *= *+1 0650 COLLO *= *+1 ;COLLISION ADDR 0660 COLHI *= *+1 0670 DMLO *= *+1 ;START SCREEN MEM 0680 DMHI *= *+1 0690 DLCNT *= *+1 ;DLI COUNTER 0700 OLDSET *= *+2 ;ADDR ROM CHSET 0710 NEWSET *= *+2 ;ADDR NEW CHSET 0720 ; 0730 *= $0600 0740 ; 0750 STOP *= *+1 ;PLAYER MOVEMENT? 0760 TEMPHI *= *+1 ;TEMPS 0770 LOX8 *= *+1 0780 SAVEX *= *+1 0790 TRGCNT *= *+1 ;READ TRIGGER? 0800 M0SND *= *+1 ;SOUNDS 0810 HITSND *= *+1 0820 P0SND *= *+1 0830 LVLSND *= *+1 0840 LVLFLG *= *+1 ;NEW LEVEL? 0850 LEVEL *= *+1 ;BCD LEVEL # 0860 LEVHEX *= *+1 ;HEX LEVEL # 0870 LEVORG *= *+1 ;ORIGINAL LEVEL 0880 P0DEAD *= *+1 ;PLAYER DEAD? 0890 SPEED *= *+1 ;BUGS SPEED 0900 BUGCNT *= *+1 ;# OF BUGS 0910 SCORE *= *+3 ;SCORE 0920 SCOADD *= *+3 ;ADD TO SCORE 0930 DIGIT *= *+1 ;FOR DISPLAY 0940 LIVES *= *+1 ;LIVES 0950 TIMER *= *+1 ;DELAY TIMER 0960 CPYCNT *= *+1 ;PAGES TO MOVE 0970 CPYTMP *= *+1 ;TEMP 0980 MSTAT *= *+1 ;WHICH MISSILES OUT 0990 MSTOP *= *+4 ;DISTANCE TO GO 1000 SPKFLG *= *+4 ;SPIKE ON? 1010 ; 1020 PMB = $2800 ;PMBASE ADDRESS 1030 CHBASE = PMB ;CHARACTER SET BASE 1040 SCOMEM = $3000 ;SCORE LINE 1050 DMEM = SCOMEM+40 ;DISPLAY MEMORY 1060 ; 1070 ; 1080 *= $2000 1090 ; 1100 JMP START 1110 ; 1120 ; 1130 ;DISPLAY LIST FOR TITLE 1140 ; 1150 DLTITL .BYTE $70,$70,$70,$70,$70 1160 .BYTE $47 1170 .WORD TITLE 1180 .BYTE $70,7,$70,$70,$70,6,$70,$70,6 1190 .BYTE $70,$70,$70,$70,$70,$70,$70,6,$30,6 1200 .BYTE $41 1210 .WORD DLTITL 1220 ; 1230 ; 1240 ;TITLE MEMORY 1250 ; 1260 TITLE 1270 .BYTE 0,0,0,0,0,0,0,43,114,161,58,121 1280 *= *+12 1290 .BYTE 43,97,180,37,114,176,41 1300 .BYTE 108,172,33,114,179 1310 *= *+13 1320 .BYTE 226,249 1330 *= *+14 1340 .BYTE 228,225,246,233,228,0,232,245,230,230 1350 *= *+9 1360 .BYTE 243,229,236,229,227,244,0 1370 .BYTE 236,229,246,229,236 1380 *= *+8 1390 .BYTE 240,242,229,243,243,0 1400 .BYTE 243,244,225,242,244 1410 *= *+10 1420 ; 1430 ; 1440 ;GAME DISPLAY LIST 1450 ; 1460 DLIST .BYTE $70,$70,$70 1470 .BYTE $46 1480 .WORD SCOMEM 1490 .BYTE $86,$C5 1500 .WORD DMEM 1510 .BYTE $85,$85,$85,$85,$85,$85,$85,$85,$85,$85 1520 .BYTE $41 1530 .WORD DLIST 1540 ; 1550 ; 1560 START CLD 1570 LDA #72 ;TITLE COLORS 1580 STA COLOR0 1590 LDA #40 1600 STA COLOR0+1 1610 LDA #120 1620 STA COLOR0+2 1630 LDA #104 1640 STA COLOR0+3 1650 LDA #0 ;BACKGND 1660 STA COLOR0+4 1670 ; 1680 LDA #DLTITL&$FF ;SHOW TITLE 1690 STA SDLSTL 1700 LDA #DLTITL/256 1710 STA SDLSTL+1 1720 ; 1730 LDX #31 ;CLEAR PAGE0 REGISTERS 1740 LDA #0 1750 CLRP0 STA $B0,X 1760 DEX 1770 BPL CLRP0 1780 ; 1790 LDX #0 ;CLEAR PAGE6 1800 TXA 1810 CLRP6 STA $0600,X 1820 DEX 1830 BNE CLRP6 1840 ; 1850 LDA #DMEM&$FF ;SET POINTER TO 1860 STA DMLO ;SCREEN MEMORY 1870 LDA #DMEM/256 1880 STA DMHI 1890 JSR CLRSM ;CLEAR PLAYFIELD 1900 ; 1910 LDX #8 ;INITIALIZE SOUNDS 1920 LDA #0 1930 NOSND STA AUDF1,X 1940 DEX 1950 BPL NOSND 1960 JSR SIOINV 1970 ; 1980 LDY #VBLANK&$FF ;START VBI 1990 LDX #VBLANK/256 2000 LDA #7 2010 JSR SETVBV 2020 ; 2030 LDX #1 ;SET LEVEL 2040 STX LEVHEX 2050 ; 2060 ; 2070 ;ROTATE TITLE COLORS 2080 ; 2090 ROTCOL LDA COLOR0+2 ;GET COLOR2 2100 PHA ;SAVE IT 2110 LDX #1 2120 COLR LDA COLOR0,X ;GET COLOR 2130 STA COLOR0+1,X ;MOVE IT 2140 DEX ;NEXT COLOR 2150 BPL COLR 2160 PLA ;GET COLOR2 2170 STA COLOR0 ;TO COLOR0 2180 ; 2190 LDA #15 ;DELAY 2200 STA TIMER 2210 TM LDA CONSOL 2220 AND #1 ;CHECK START 2230 BEQ BEGIN ;PRESSED, BEGIN GAME 2240 LDA TIMER ;TIME UP? 2250 BNE TM ;NO 2260 ; 2270 LDA CONSOL 2280 AND #2 ;CHECK SELECT 2290 BNE SHOLEV ;NOT PRESSED 2300 INC LEVHEX ;PRESSED 2310 LDA #$AA ;BEEP 2320 STA AUDC4 2330 LDA #121 2340 STA AUDF4 2350 LDA #10 ;DURATION 2360 STA LVLSND 2370 SHOLEV LDA LEVHEX ;GET LEVEL 2380 CMP #10 ;TO BIG? 2390 BCC OKLEV ;NO 2400 LDA #1 ;YES,RESET 2410 STA LEVHEX 2420 OKLEV ORA #$D0 ;COLOR3 2430 LDX #97 2440 STA TITLE,X ;DISPLAY IT 2450 JMP ROTCOL ;TITLE ROUTINE 2460 ; 2470 BEGIN DEC LEVHEX ;WANT (0-9) 2480 LDX LEVHEX ;START LEVEL 2490 STX LEVEL 2500 STX LEVORG ;KEEP ORIGINAL LEVEL 2510 ; 2520 ; 2530 ;REDEFINE CHARACTERS 2540 ; 2550 LDA #$E0 ;ADDR ROM CHSET 2560 STA OLDSET+1 2570 LDA #CHBASE/256 ;NEW CHBASE 2580 STA NEWSET+1 2590 LDA #0 ;LOW BYTES 2600 STA OLDSET 2610 STA NEWSET 2620 ; 2630 LDX #1 ;DO 2 PAGES OF CHSET 2640 CH1 LDY #0 2650 CH2 LDA (OLDSET),Y ;GET ROM 2660 STA (NEWSET),Y ;PUT IN RAM 2670 DEY 2680 BNE CH2 2690 INC OLDSET+1 ;DO NEXT PAGE 2700 INC NEWSET+1 2710 DEX 2720 BPL CH1 2730 ; 2740 NEWCH LDX #39 ;REDEFINE CHARACTERS 2750 NEW1 LDA CHR1,X ;GET CHAR DATA 2760 STA CHBASE,X ;MOVE IT 2770 DEX 2780 BPL NEW1 2790 ; 2800 ;GAME COLORS 2810 ; 2820 LDA #28 ;SCORE NUMBERS 2830 STA COLOR0 2840 LDA #136 ;SCORE LETTERS 2850 STA COLOR0+1 2860 LDA #204 ;BUGS LEGS 2870 STA COLOR0+2 2880 LDA #42 ;MISSILES 2890 STA COLOR0+3 2900 LDA #0 ;BACKGND 2910 STA COLOR0+4 2920 ; 2930 LDA #DLIST&$FF ;GAME DISPLA ON 2940 STA SDLSTL 2950 LDA #DLIST/256 2960 STA SDLSTL+1 2970 ; 2980 LDA #DLI&$FF ;SET DLI VECTOR 2990 STA VDSLST 3000 LDA #DLI/256 3010 STA VDSLST+1 3020 ; 3030 LDA #$C0 ;ENABLE DLI 3040 STA NMIEN 3050 ; 3060 LDA #CHBASE/256 ;SWITCH CHAR BASE 3070 STA CHBAS 3080 ; 3090 LDA #3 ;ENABLE P/M 3100 STA GRACTL 3110 LDA #62 ;SINGLE LINE RES. 3120 STA SDMCTL 3130 LDA #PMB/256 ;HI BYTE PMBASE 3140 STA PMBASE 3150 LDA #16 ;FIFTH PLAYER ENABLE 3160 STA GPRIOR 3170 LDX #0 ;NORMAL SIZE 3180 STX SIZEP0 3190 STX SIZEM 3200 LDA #PMB/256+4 ;PLAYER0 BASE 3210 STA VP0HI 3220 LDA #PMB/256+3 ;MISSILE BASE 3230 STA VPM0HI 3240 JSR CLRPM ;CLEAR P/M AREA 3250 ; 3260 RESET LDX #39 ;DISPLAY SCORE LINE 3270 SCRLN LDA SCOLN,X 3280 STA SCOMEM,X 3290 DEX 3300 BPL SCRLN 3310 ; 3320 LDX #0 ;SCORE = 0 3330 STX SCORE 3340 STX SCORE+1 3350 STX SCORE+2 3360 JSR DISPSCO ;PUT ON SCORE 3370 ; 3380 LDX #4 ;4 LIVES 3390 STX LIVES 3400 JSR NEWLVL ;GET FIRST LEVEL 3410 ; 3420 LDX #1 ;ENABLE MOVEMENT 3430 STX STOP 3440 STX HITCLR ;CLEAR COLLISIONS 3450 ; 3460 ; 3470 ; 3480 ;MAIN LOOP 3490 ; 3500 PLAY JSR COPY ;MOVE BUGS 3510 JSR MFIRE ;MOVE MISSILES 3520 JSR DISPSCO ;SHOW SCORE 3530 JSR DELAY ;SLOW IT DOWN 3540 JSR MFIRE ;MOVE AGAIN 3550 JSR CKLEV ;CHECK LEVEL 3560 LDA LVLFLG ;COMPLETE? 3570 BEQ CHKP0 ;NO 3580 JSR NEWLVL ;YES,DO NEXT LEVEL 3590 ; 3600 CHKP0 LDA P0DEAD ;PLAYER DEAD 3610 BEQ ALIVE ;NO 3620 JMP KILLP0 ;YES,EXPLOSION 3630 ; 3640 ALIVE JMP PLAY ;CONTINUE GAME 3650 ; 3660 ; 3670 ;PLAYER KILLED 3680 ; 3690 KILLP0 LDA #0 ;NO MOTION 3700 STA STOP 3710 STA P0DEAD ;RESET FLAG 3720 ; 3730 LDY #17 ;SHOW EXPLOSION 3740 EXP LDA EXPLODE,Y ;DATA 3750 STA (VP0LO),Y ;SHOW IT 3760 DEY 3770 BPL EXP 3780 ; 3790 LDA #32 ;TURN ON SOUND 3800 STA AUDF3 3810 LDA #34 3820 STA P0SND 3830 DLY LDA P0SND ;WAIT 3840 BNE DLY 3850 ; 3860 JSR CLRPM ;CLEAR P/M AREA 3870 ; 3880 DEC LIVES ;LOSE A LIFE 3890 LDA LIVES ;ANY LEFT? 3900 BEQ DEAD ;NO 3910 JSR DISPLIV ;YES,SHOW THEM 3920 JSR CLRSM ;CLEAR SCREEN 3930 JSR SETUP ;SETUP LEVEL 3940 JSR STARTP0 ;RESTART 3950 LDA #1 3960 STA HITCLR ;CLEAR COLLISION 3970 STA STOP ;ALLOW MOVEMENT 3980 JMP PLAY ;TO MAIN LOOP 3990 ; 4000 ; 4010 ; 4020 ; GAME OVER ROUTINE 4030 ; 4040 DEAD LDX #8 4050 DD1 LDA MESSAGE,X ;GAME OVER 4060 STA SCOMEM+25,X ;SHOW IT 4070 DEX 4080 BPL DD1 4090 ; 4100 JSR CLRSM ;CLEAR SCREEN 4110 LDA #10 4120 STA BUGCNT ;10 BUGS 4130 JSR SET1 ;SHOW THEM 4140 LDA #10 4150 STA BUGCNT ;10 BUGS 4160 INC DMHI ;NEXT PAGE 4170 JSR SET1 ;SHOW THEM 4180 DEC DMHI ;RESTORE 4190 ; 4200 WAIT LDA CONSOL 4210 AND #1 ;START? 4220 BNE WT1 ;NO 4230 WT2 LDA CONSOL ;YES 4240 AND #1 ;RELEASED? 4250 BEQ WT2 ;NO 4260 JMP START ;YES, DO TITLE 4270 ; 4280 WT1 LDA STRIG0 ;PRESSED? 4290 BEQ RESTART ;YES 4300 LDA TIMER ;TIME UP? 4310 BNE WAIT ;NO 4320 JSR COPY ;MOVE BUGS 4330 LDA #10 ;RELOAD TIMER 4340 STA TIMER 4350 JMP WAIT ;KEEP CHECKING 4360 ; 4370 RESTART LDX LEVORG ;ORIGINAL LEV 4380 STX LEVEL ;RESET 4390 STX LEVHEX 4400 JSR CLRSM ;CLEAR SCREEN 4410 JMP RESET ;RESTART 4420 ; 4430 ; 4440 ; 4450 ; 4460 ;SUBROUTINES 4470 ; 4480 ; 4490 ;MISSILE ROUTINES 4500 ; 4510 MFIRE LDX #3 ;DO 4 MISSILES 4520 CKP0 LDA M0PL,X ;PLAYER HIT? 4530 BEQ NOMHIT ;NO 4540 INC P0DEAD ;YES,SET FLAG 4550 JMP FMEXIT ;DONE 4560 NOMHIT DEX ;NEXT MISSILE 4570 BPL CKP0 4580 ; 4590 LDX #3 ;DO 4 MISSILES 4600 CKM LDA M0PF,X ;BUG HIT? 4610 BEQ NOHIT ;NO 4620 JSR KILLBUG ;YES, DESTROY IT 4630 NOHIT DEX ;NEXT MISSILE 4640 BPL CKM 4650 ; 4660 LDX #1 ;CLEAR COLLISIONS 4670 STX HITCLR 4680 ; 4690 LDX #3 ;MOVE MISSILES IF OUT 4700 FIREM LDA MSTAT ;MISSILE STATUS 4710 AND MDATA,X ;IS IT OUT? 4720 BEQ NOMOVE ;NO 4730 JSR MOVEM ;YES, MOVE IT 4740 NOMOVE DEX ;NEXT ONE 4750 BPL FIREM 4760 ; 4770 TRIG LDA TRGCNT ;CHECK TRIG? 4780 BEQ CKTRIG ;YES 4790 DEC TRGCNT ;NO 4800 JMP FMEXIT ;DONE 4810 ; 4820 CKTRIG LDA #4 ;RESET IT 4830 STA TRGCNT 4840 LDA STRIG0 ;PRESSED? 4850 BEQ LAUNCH ;YES, TRY TO FIRE 4860 JMP FMEXIT ;NO 4870 ; 4880 LAUNCH LDX #3 4890 NEXTM LDA MSTAT ;ANY AVAILABLE? 4900 AND MDATA,X ;CHECK BITS 4910 BNE MOUT ;NO,ALREADY OUT 4920 LDA MDATA,X ;YES 4930 ORA MSTAT ;UPDATE MSTAT 4940 STA MSTAT ;TO SHOW IT'S OUT 4950 JSR STARTM ;START IT 4960 JMP FMEXIT ;CAN ONLY FIRE 1 4970 MOUT DEX ;TRY NEXT ONE 4980 BPL NEXTM 4990 JMP FMEXIT 5000 ; 5010 STARTM LDA #$A6 ;MISSILE SOUND 5020 STA AUDC1 5030 LDA #15 5040 STA M0SND 5050 ; 5060 LDA SHP0 ;GET PLAYERS X POS. 5070 CLC 5080 ADC #3 ;OFFSET 5090 STA HPOSM0,X 5100 STA SHM0,X ;SAVE MISSILE POS. 5110 ; 5120 SEC 5130 LDA VP0LO ;PLAYERS VERT .POS 5140 SBC #5 ;OFFSET 5150 STA VPMLO,X ;SAVE IT 5160 ; 5170 LDA #65 ;MOVE IT 65 TIMES 5180 STA MSTOP,X 5190 ; 5200 JSR MOVEM ;MOVE IT 5210 RTS 5220 ; 5230 MOVEM LDA VPMLO,X ;GET Y 5240 STA VPM0LO ;SAVE IT 5250 ; 5260 DEC MSTOP,X ;DONE? 5270 BEQ CLEARM ;YES, CLEAR IT 5280 ; 5290 LDA SPKFLG,X ;SPIKE? 5300 BNE SPIKE ;YES 5310 LDY #2 ;NO,ERASE OLD POS. 5320 CLRM LDA MDATA,X ;GET BITS 5330 EOR #$FF ;MAKE MASK 5340 AND (VPM0LO),Y ;ZERO BITS 5350 STA (VPM0LO),Y ;MISSILE OFF 5360 DEY 5370 BPL CLRM 5380 ; 5390 SPIKE SEC 5400 LDA VPM0LO ;OLD Y 5410 SBC #3 ;MOVE UP 3 5420 STA VPM0LO 5430 STA VPMLO,X ;SAVE NEW Y 5440 CMP #50 ;TOP LIMIT 5450 BCC SPKON ;YES,SPIKE ON 5460 LDY #2 ;NO 5470 LOADM LDA (VPM0LO),Y 5480 ORA MDATA,X ;GET MISSILE BITS 5490 STA (VPM0LO),Y ;MISSILE ON 5500 DEY 5510 BPL LOADM 5520 RTS 5530 ; 5540 SPKON LDA #255 ;SPIKE ON 5550 STA VPMLO,X ;MISSILE TO BOTTOM 5560 STA SPKFLG,X ;SET FLAG 5570 RTS 5580 ; 5590 CLEARM LDY #0 ;ERASE A MISSILE 5600 LDA #0 5610 STA VPM0LO 5620 CLM LDA MDATA,X ;GET MISSILE BITS 5630 EOR #$FF ;MAKE MASK 5640 AND (VPM0LO),Y ;ZERO BITS 5650 STA (VPM0LO),Y ;TURN IT OFF 5660 DEY ;DO ALL OF MISSILE 5670 BNE CLM 5680 ; 5690 LDA #0 ;RESET 5700 STA MSTOP,X 5710 STA SPKFLG,X 5720 ; 5730 LDA MDATA,X ;MISSILE BITS 5740 EOR MSTAT ;MISSILE NOT OUT 5750 STA MSTAT ;UPDATE MSTAT 5760 RTS 5770 ; 5780 ; 5790 KILLBUG JSR CLEARM ;HIT A BUG 5800 LDA VPMLO,X ;GET Y POS. 5810 STA VPM0LO 5820 LDA SHM0,X ;GET X POS 5830 STA HPOSM 5840 ; 5850 STX SAVEX ;SAVE MISSILE # 5860 JSR FIND ;GET MEMORY LOCATION 5870 ; 5880 LDA #0 ;ERASE THE BUG 5890 STA (COLLO),Y ;FIRST PART 5900 INY 5910 STA (COLLO),Y ;SECOND PART 5920 ; 5930 LDA #$20 ;UP SCORE 5940 STA SCOADD+2 5950 ; 5960 LDA #$A8 ;SOUND ON 5970 STA AUDC2 5980 LDA #11 5990 STA HITSND 6000 LDX SAVEX ;RECOVER MISSILE # 6010 RTS 6020 ; 6030 FMEXIT RTS TO MAIN LOOP 6040 ; 6050 MDATA .BYTE 3,12,48,192 6060 ; 6070 ; 6080 ; 6090 ;SHOW NEXT LEVEL 6100 ; 6110 NEWLVL SED ;BCD ADDITION 6120 CLC 6130 LDA LEVEL ;BCD LEVEL 6140 ADC #1 6150 STA LEVEL 6160 CLD 6170 ; 6180 LDA #0 6190 STA STOP ;STOP MOVEMENT 6200 STA LVLFLG ;RESET FLAG 6210 ; 6220 INC LEVHEX ;HEX LEVEL 6230 LDA LEVHEX 6240 CMP #16 ;TOO BIG? 6250 BCC LEVOK ;NO 6260 LDA #14 ;YES 6270 STA LEVHEX 6280 LEVOK LDX LEVHEX ;INDEX 6290 LDA LEVSPEED,X ;GET LEVEL SPEED 6300 STA SPEED ;FOR COPY ROUTINE 6310 ; 6320 LDA #$A8 ;NEW LEVEL SOUND 6330 STA AUDC4 6340 LDA #200 6350 STA AUDF4 6360 LDA #80 ;SOUND DURATION 6370 STA LVLSND 6380 ; 6390 JSR CLRPM ;CLEAR P/M 6400 JSR DISPLIV ;SHOW LIVES 6410 JSR DISPSCO ;SHOW SCORE 6420 JSR SETUP ;NEXT LEVEL 6430 JSR STARTP0 ;START PLAYER 6440 ; 6450 LDA #150 ;DELAY BETWEEN LEVELS 6460 STA TIMER 6470 DLEV1 LDA TIMER 6480 BNE DLEV1 6490 LDA #1 6500 STA STOP ;ALLOW MOVEMENT 6510 RTS 6520 ; 6530 LEVSPEED .BYTE 0,30,25,20,25,17,10,15 6540 .BYTE 12,10,10,7,6,5,5,4 6550 ; 6560 ; 6570 ; 6580 DELAY LDX SPEED ;SLOW IT DOWN 6590 DE1 LDY #255 6600 DE2 DEY 6610 BNE DE2 6620 DEX 6630 BNE DE1 6640 RTS 6650 ; 6660 ; 6670 ; 6680 ;MOVE THE BUGS 6690 ; 6700 COPY LDX #2 ;DO 2 PAGES 6710 STX CPYCNT 6720 ; 6730 LDY #$FF 6740 INC DMHI 6750 LDA (DMLO),Y ;GET LAST BYTE 6760 TAX ;SAVE IT 6770 DEC DMHI ;RESTORE 6780 ; 6790 CPY1 LDY #0 ;SET TO FIRST BYTE 6800 CPY2 STX CPYTMP 6810 LDA (DMLO),Y ;GET BYTE 6820 TAX ;STORE 6830 LDA CPYTMP ;GET PREVIOUS BYTE 6840 STA (DMLO),Y ;MOVE IT 6850 INY ;NEXT BYTE 6860 BNE CPY2 6870 ; 6880 INC DMHI ;NEXT PAGE 6890 DEC CPYCNT ;DONE? 6900 BNE CPY1 ;NO 6910 ; 6920 DEC DMHI ;YES,RESTORE 6930 DEC DMHI 6940 RTS 6950 ; 6960 ; 6970 ; 6980 ;CALCULATE SCREEN MEMORY ADDRESS 6990 ;FROM P/M COORDINATES 7000 ; 7010 FIND SEC 7020 LDA HPOSM ;X POS 7030 SBC #48 ;OFFSET 7040 LSR A ;/2 7050 LSR A ;/4 7060 TAX ;X COORD 7070 ; 7080 LDA #0 ;CLEAR 7090 STA TEMPHI 7100 ; 7110 SEC ;Y=Y/16*40 BYTES/LINE 7120 LDA VPM0LO ;Y POS 7130 SBC #48 ;OFFSET 7140 AND #$F0 ;Y/16*16 7150 LSR A ;SHIFT RIGHT (*8) 7160 STA LOX8 ;SAVE *8 7170 ; 7180 ASL A ;*16 7190 ASL A ;*32 7200 ROL TEMPHI ;SHIFT CARRY 7210 ; 7220 CLC ;ADD *8+*32=*40 7230 ADC LOX8 7240 STA COLLO ;*40 LO 7250 LDA TEMPHI 7260 ADC #0 7270 STA COLHI ;*40 HI 7280 ; 7290 CLC ;GET FINAL COLLISION ADDR 7300 LDA #DMEM&$FF ;SCREEN MEM 7310 ADC COLLO ;ADD POSITION 7320 STA COLLO ;COLLISION ADDR LO 7330 LDA #DMEM/256 7340 ADC COLHI 7350 STA COLHI ;COLLISION ADDR HI 7360 ; 7370 TXA ;GET X 7380 TAY ;Y=INDEX FOR X POS 7390 RTS 7400 ; 7410 ; 7420 ; 7430 ;SCORE AND LEVEL DISPLAY 7440 ; 7450 DISPSCO SED ;BCD ADDITION 7460 CLC 7470 LDX #2 ;DO 3 BYTES 7480 TOTAL LDA SCORE,X ;GET OLD SCORE 7490 ADC SCOADD,X ;ADD TO SCORE 7500 STA SCORE,X ;SAVE SCORE 7510 DEX 7520 BPL TOTAL 7530 CLD 7540 ; 7550 LDX #2 ;CLEAR SCOADD 7560 LDA #0 7570 ZERO STA SCOADD,X 7580 DEX 7590 BPL ZERO 7600 ; 7610 LDX #6 ;POSITION 6 7620 LDY #0 7630 SCODP LDA SCORE,Y ;GET BYTE 7640 JSR DISP ;DISPLAY IT 7650 INX ;NEXT POSITION 7660 INX 7670 INY ;NEXT BYTE 7680 CPY #3 ;DO 3 BYTES 7690 BNE SCODP 7700 ; 7710 DISPLVL LDX #17 ;POSITION 17 7720 LDA LEVEL ;LEVEL 7730 JSR DISP ;DISPLAY IT 7740 ; 7750 RTS 7760 ; 7770 ; 7780 DISP STA DIGIT ;BCD # TO SHOW 7790 AND #$0F ;LOWER NIBBLE 7800 ORA #$10 ;COLOR0 7810 ; 7820 STA SCOMEM+1,X ;DISLPAY IT 7830 LDA DIGIT ;GET BCD # 7840 LSR A ;GET HIGH NIBBLE 7850 LSR A 7860 LSR A 7870 LSR A 7880 ORA #$10 ;COLOR0 7890 STA SCOMEM,X ;DISPLAY IT 7900 RTS 7910 ; 7920 ; 7930 ; 7940 ;DISPLAY REMAINING LIVES 7950 ; 7960 DISPLIV LDA #PMB/256+5 ;PLAYER 1 Y POS. 7970 STA VP1HI 7980 LDA #38 7990 STA VP1LO 8000 ; 8010 LDX #3 ;REMOVE ALL 8020 LDA #0 ;FROM SCREEN 8030 LD1 STA HPOSP0,X 8040 DEX 8050 BNE LD1 8060 ; 8070 LDA #26 ;COLORS 8080 STA PCOLR0+1 8090 STA PCOLR0+2 8100 STA PCOLR0+3 8110 ; 8120 LDX #2 ;DO 3 PLAYERS 8130 LD2 LDY #13 8140 LD3 LDA P0DATA,Y ;SHAPE DATA 8150 STA (VP1LO),Y ;SHOW IT 8160 DEY 8170 BPL LD3 8180 INC VP1HI ;NEXT PLAYER 8190 DEX 8200 BPL LD2 8210 ; 8220 LDX LIVES 8230 DEX ;SHOW ONE LESS 8240 BEQ LD5 ;NONE TO SHOW 8250 LD4 LDA TABX,X ;POSITIONS 8260 STA HPOSP0,X ;SHOW PLAYERS 8270 DEX 8280 BNE LD4 8290 LD5 RTS 8300 ; 8310 TABX .BYTE 0,176,183,190 8320 ; 8330 ; 8340 ; 8350 ;DISPLAY LIST INTERRUPT 8360 ; 8370 DLI PHA ;SAVE X,Y,A 8380 TXA 8390 PHA 8400 TYA 8410 PHA 8420 ; 8430 LDX DLCNT ;WHICH LINE 8440 LDA BODYCLR,X ;COLOR0 8450 LDY SPOTCLR,X ;COLOR1 8460 STA WSYNC ;WAIT FOR SYNC 8470 STA COLPF0 ;CHANGE HARDWARE REG 8480 STY COLPF0+1 8490 INC DLCNT ;NEXT LINE 8500 CPX #11 ;LAST ONE? 8510 BNE DLIEND ;NO 8520 LDX #0 ;YES 8530 STX DLCNT ;RESET TO TOP 8540 ; 8550 DLIEND PLA ;RESTORE X,Y,A 8560 TAY 8570 PLA 8580 TAX 8590 PLA 8600 RTI 8610 ; 8620 BODYCLR .BYTE 134,198,24,86,126,182,70,42,6,102,14 8630 ; 8640 SPOTCLR .BYTE 14,26,60,28,136,202,122,70,28,60,168 8650 ; 8660 ; 8670 ; 8680 ; 8690 ;CLEAR P/M MEMORY 8700 ; 8710 CLRPM LDA #0 ;MISSILE BASE 8720 STA VPM0LO 8730 ; 8740 LDX #5 ;DO 5 PAGES UP 8750 LDA #0 8760 TAY 8770 CPM STA (VPM0LO),Y ;CLEAR IT 8780 DEY 8790 BNE CPM 8800 INC VPM0HI ;NEXT PAGE 8810 DEX 8820 BNE CPM 8830 ; 8840 LDA #PMB/256+3 ;RESET 8850 STA VPM0HI 8860 ; 8870 LDX #3 ;UPDATE TO SHOW 8880 LDA #0 ;ALL MISSILES OFF 8890 OFF STA SPKFLG,X 8900 STA MSTOP,X 8910 STA MSTAT 8920 DEX 8930 BPL OFF 8940 ; 8950 RTS 8960 ; 8970 ; 8980 ; 8990 ;START PLAYER 9000 ; 9010 STARTP0 LDA #128 ;Y START POS. 9020 STA VP0LO 9030 LDA #100 ;X 9040 STA HPOSP0 9050 STA SHP0 9060 ; 9070 LDA #14 9080 STA PCOLR0 ;COLOR P0 9090 ; 9100 LDY #13 9110 DISP0 LDA P0DATA,Y ;SHAPE DATA 9120 STA (VP0LO),Y ;SHOW IT 9130 DEY 9140 BPL DISP0 9150 ; 9160 RTS 9170 ; 9180 ; 9190 ; 9200 ;CLEAR SCREEN MEMORY 9210 ; 9220 CLRSM LDX #1 ;2 PAGES 9230 LDA #0 9240 TAY 9250 CSM STA (DMLO),Y ;CLEAR IT 9260 DEY 9270 BNE CSM 9280 INC DMHI ;NEXT PAGE 9290 DEX 9300 BPL CSM 9310 ; 9320 LDA #DMEM/256 ;RESTORE 9330 STA DMHI 9340 ; 9350 RTS 9360 ; 9370 ; 9380 ; 9390 ;PLAYFIELD SETUP 9400 ; 9410 SETUP JSR RNDPF ;PUT ON BUGS 9420 INC DMHI ;NEXT PAGE OF MEMORY 9430 JSR RNDPF ;MORE BUGS 9440 DEC DMHI ;RESTORE 9450 ; 9460 CLC 9470 LDA DMLO ;FIND ADDR 9480 ADC #160 ;SCREEN CENTER 9490 STA DMLO 9500 LDA DMHI 9510 ADC #0 9520 STA DMHI 9530 ; 9540 LDY #160 ;CLEAR 4 LINES 9550 LDA #0 ;IN SCREEN CENTER 9560 CP0S STA (DMLO),Y ;FOR START 9570 DEY 9580 BNE CP0S 9590 ; 9600 LDA #DMEM&$FF ;RESTORE 9610 STA DMLO 9620 LDA #DMEM/256 9630 STA DMHI 9640 RTS 9650 ; 9660 ; 9670 RNDPF LDX LEVHEX ;INDEX 9680 LDA BUGLEV,X ;# TO DISPLAY 9690 STA BUGCNT 9700 ; 9710 SET1 LDY RANDOM ;POSITION 9720 JSR BUG ;SHOW THEM 9730 DEC BUGCNT ;ANY MORE? 9740 BPL SET1 ;YES 9750 RTS ;NO 9760 ; 9770 BUG LDX #4 ;CHARACTERS 1-4 9780 SBUG TXA 9790 STA (DMLO),Y ;SHOW BUGS 9800 DEY 9810 DEX 9820 BNE SBUG 9830 ; 9840 RTS 9850 ; 9860 BUGLEV .BYTE 0,6,10,15,25,16,10 9870 .BYTE 20,22,25,25,27,30,30,35,35 9880 ; 9890 ; 9900 ; 9910 ;CHECK IF LEVEL COMPLETE 9920 ; 9930 CKLEV LDX #1 ;2 PAGES 9940 LDY #0 9950 CKL1 LDA (DMLO),Y ;GET MEMORY 9960 BNE NOTDONE ; IF<>0 NOT DONE 9970 DEY ;CHECK NEXT 9980 BNE CKL1 9990 INC DMHI ;NEXT PAGE 010000 DEX 010010 BPL CKL1 010020 ; 010030 LDX #1 ;ALL ZERO,LEVEL DONE 010040 STX LVLFLG ;SET FLAG 010050 BNE LVLDONE 010060 ; 010070 NOTDONE LDX #0 ;NOT DONE 010080 STX LVLFLG 010090 LVLDONE LDA #DMEM/256 ;RESET 010100 STA DMHI 010110 ; 010120 RTS 010130 ; 010140 ; 010150 ; 010160 ; 010170 ; 010180 ; VBLANK ROUTINE 010190 ; 010200 ; 010210 VBLANK CLD 010220 ; 010230 LDX TIMER ;COUNT DOWN TIMER 010240 BEQ SOUND1 010250 DEC TIMER 010260 ; 010270 SOUND1 LDX M0SND ;MISSILE SOUND ON? 010280 BEQ NOSND1 ;NO 010290 LDA M0SND1,X ;YES, NEXT FREQ 010300 STA AUDF1 010310 DEC M0SND 010320 BNE SOUND2 010330 NOSND1 LDA #0 ;OFF 010340 STA AUDC1 010350 ; 010360 SOUND2 LDX HITSND ;BUG HIT SND ON? 010370 BEQ NOSND2 ;NO 010380 LDA HITSND2,X ;YES, NEXT FREQ 010390 STA AUDF2 010400 DEC HITSND 010410 BNE SOUND3 010420 NOSND2 LDA #0 ;OFF 010430 STA AUDC2 010440 ; 010450 SOUND3 LDA P0SND ;BLOW UP SND ON? 010460 BEQ NOSND3 ;NO 010470 LSR A ;YES,/2 010480 STA AUDC3 010490 DEC P0SND 010500 BNE SOUND4 010510 NOSND3 LDA #0 ;OFF 010520 STA AUDC3 010530 ; 010540 SOUND4 LDX LVLSND ;SOUND 4 ON? 010550 BEQ NOSND4 ;NO 010560 DEC LVLSND ;YES 010570 BNE STOPVB 010580 NOSND4 LDA #$00 ;OFF 010590 STA AUDC4 010600 ; 010610 STOPVB LDA STOP ;CONTINUE? 010620 BNE COLCK ;YES 010630 EXIT JMP XITVBV ;NO 010640 ; 010650 COLCK LDA P0PF ;PLAYER HIT? 010660 BEQ MOVE ;NO 010670 INC P0DEAD ;YES,SET FLAG 010680 JMP EXIT 010690 ; 010700 MOVE LDX SHP0 ;PLAYER X POS 010710 LDY VP0LO ;Y POS 010720 ; 010730 LDA STICK0 010740 LSR A ;CHECK D0 010750 BCS NOTUP ;SET,NO MOTION 010760 DEY ;NOT SET,MOVE UP 2 010770 DEY 010780 ; 010790 NOTUP LSR A ;CHECK D1 010800 BCS NOTDOWN ;NO 010810 INY ;MOVE DOWN 2 010820 INY 010830 ; 010840 NOTDOWN LSR A ;CHECK D2 010850 BCS NOTLEFT ;NO 010860 DEX ;MOVE 2 LEFT 010870 DEX 010880 ; 010890 NOTLEFT LSR A ;CHECK D3 010900 BCS NOTRT ;NO 010910 INX ;MOVE 2 RIGHT 010920 INX 010930 ; 010940 NOTRT CPX #50 ;LEFT LIMIT 010950 BCC BADX ;TOO FAR 010960 CPX #208 ;RIGHT LIMIT 010970 BCC GOODX ;OK? YES 010980 LDX #50 ;NO,RESET TO LEFT 010990 GOODX STX SHP0 ;NEW X POS 011000 STX HPOSP0 011010 ; 011020 BADX CPY #90 ;UPPER LIMIT 011030 BCC BADY ;TOO FAR? YES 011040 CPY #185 ;LOWER LIMIT 011050 BCS BADY ;TOO FAR? YES 011060 STY VP0LO ;OK, SAVE IT 011070 ; 011080 BADY LDY #13 ;READ IN PLAYER 011090 LP1 LDA P0DATA,Y ;AT VP0LO 011100 STA (VP0LO),Y 011110 DEY 011120 BPL LP1 011130 ; 011140 LDA #0 ;STOP ATTRACT 011150 STA ATRACT 011160 JMP EXIT ;ALL DONE 011170 ; 011180 ; 011190 ; 011200 ;DATA TABLES 011210 ; 011220 P0DATA 011230 .BYTE 0,0,8,8,8,28,28,62,62,62,62,62,0,0 011240 ; 011250 EXPLODE 011260 .BYTE 8,16,74,34,72,68,16,133,16 011270 .BYTE 4,162,20,69,18,72,18,8,16 011280 ; 011290 M0SND1 011300 .BYTE 230,240,250,255,230,200,180,170,150,130 011310 .BYTE 100,75,65,50,45,40 011320 ; 011330 HITSND2 011340 .BYTE 120,100,90,80,75,70,50,40,30,20,10,5 011350 ; 011360 MESSAGE 011370 .BYTE 167,161,173,165,0,175,182,165,178 011380 ; 011390 CHR1 .BYTE 0,0,0,0,0,0,0,0 011400 .BYTE 0,12,51,86,90,86,51,12 011410 .BYTE 0,204,51,149,165,149,51,204 011420 .BYTE 0,204,51,86,90,86,51,204 011430 .BYTE 0,192,48,148,165,148,48,192 011440 ; 011450 SCOLN 011460 .BYTE $73,$63,$6F,$72,$65,0,0,0,0,0,0,0,0 011470 .BYTE $6C,$76,$6C,0,0,0 011480 *= *+21 011490 ; 011500 .END